package pl.edu.pk.psb.validator;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import pl.edu.pk.psb.command.AdresCommand;

@Component
public class AdresValidator extends OgolnyValidator implements Validator {

	private static final String WALIDACJA_NIEPOPRAWNA_WARTOSC = "walidacja.niepoprawnaWartosc";
	private static final String WALIDACJA_KOD_POCZTOWY_FORMAT = "walidacja.kodPocztowyFormat";
	private static final String KOD_POCZTOWY_PATTERN = "[0-9]{2}-[0-9]{3}";

	@Override
	public void validate(Object obiekt, Errors bledy) {
		AdresCommand command = (AdresCommand) obiekt;

		if (!czyPoprawnyString(command.getMiasto(), true)) {
			bledy.rejectValue("miasto", WALIDACJA_NIEPOPRAWNA_WARTOSC);
		}
		if (!czyPoprawnyKodPocztowy(command.getKodPocztowy())) {
			bledy.rejectValue("kodPocztowy", WALIDACJA_KOD_POCZTOWY_FORMAT);
		}
		if (!czyPoprawnyString(command.getUlica(), true)) {
			bledy.rejectValue("ulica", WALIDACJA_NIEPOPRAWNA_WARTOSC);
		}
		if (!czyPoprawnyString(command.getNrDomu(), true)) {
			bledy.rejectValue("nrDomu", WALIDACJA_NIEPOPRAWNA_WARTOSC);
		}
		if (!czyPoprawnyNrLokalu(command.getNrLokalu())) {
			bledy.rejectValue("nrLokalu", WALIDACJA_NIEPOPRAWNA_WARTOSC);
		}
		if (StringUtils.isNotBlank(command.getNazwa()) && !czyPoprawnyString(command.getNazwa(), true)) {
			bledy.rejectValue("nazwa", WALIDACJA_NIEPOPRAWNA_WARTOSC);
		}
	}

	private boolean czyPoprawnyKodPocztowy(String kod) {
		Pattern pattern = Pattern.compile(KOD_POCZTOWY_PATTERN);
		Matcher matcher = pattern.matcher(kod);
		return matcher.matches();
	}

	private boolean czyPoprawnyNrLokalu(String numer) {
		return StringUtils.isEmpty(numer) ? true : czyPoprawnyString(numer, true);
	}

	@Override
	public boolean supports(Class<?> klasa) {
		return AdresCommand.class.isAssignableFrom(klasa);
	}

}
